﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ControlPresupuesto
{
    public partial class FrmPresupuestoAnualMovimientosSaldos : Form
    {
        private string codRubroOrigenActual;
        private string codRubroDestinoActual;
        private string codPresupuesto = string.Empty;
        private bool cancelandoOperacion = false;

        public FrmPresupuestoAnualMovimientosSaldos()
        {
            InitializeComponent();

            //---inicializo la ventana
            this.bloquearCampos(true);   
        }

        private void FrmPresupuestoAnualMovimientos_Load(object sender, EventArgs e)
        {
            //-- Blanquear Campos
            //Utils.get().blanquearCampos(this);

            try
            {
                //-- Cargo los centros de costo
                this.spCentroCostoTableAdapter.Fill(this.controlPresupuestoDataSet.spCentroCosto);

                //-- Consulto los presupuestos publicados
                this.spPresupuestoAnualCabeceraTableAdapter.FillBy(
                    this.controlPresupuestoDataSet.spPresupuestoAnualCabecera,
                    "ConsultarPresupuestosPublicados",
                    null,
                    null,

                    null,
                    null,
                    null,
                    null,
                    null,
                    null
                    );

                //-- Consulto el presupuesto correspondiente al año vigente

                ControlPresupuestoDataSet.spPresupuestoAnualCabeceraDataTable table = new ControlPresupuestoDataSet.spPresupuestoAnualCabeceraDataTable();
                this.spPresupuestoAnualCabeceraTableAdapter.FillBy(
                    table,
                    "ConsultarPresupuestoAnoActual",
                    null,
                    null,
                    null,
                    null,
                    null,
                    null,
                    null,
                    null
                    );
                if (table.Rows.Count > 0)
                {
                    this.codPresupuesto = table[0].CodPresupuesto;
                }

                //--- Consulto los rubros del presupuesto seleccionado
                this.spRubroTableAdapter1.FillBy(
                    this.controlPresupuestoDataSet.spRubro,
                    "CargarRubrosPresupuesto",
                    this.codPresupuesto,
                    null,
                    null,
                    null,
                    null,
                    null,
                    null
                    );

                //--- Cargo los movimientos presupuestales
                this.spPresupuestoMovimientoSaldosTableAdapter.Fill(this.controlPresupuestoDataSet.spPresupuestoMovimientoSaldos);

                //--- Cargo el codigo del presupuesto
                this.codPresupuestoBuscadorAWIL.AWIL_Texto = this.codPresupuesto;
            }
            catch (Exception)
            {
                //--- Con esto controlo que no muestre el msn: "el presupuesto no ha sido publicado" cada vez que se 
                //--- ingrese a esta ventana
                return;
            }


            //if (this.controlPresupuestoDataSet.spPresupuestoMovimiento.Rows.Count == 0)
            //{
            //    this.NuevoButton_Click(null, null);
            //}
        }

        private void bloquearCampos(bool enabled)
        {
            this.codPresupuestoBuscadorAWIL.ReadOnly = enabled;
            this.codSaldoOrigenComboBox.Enabled = !enabled;
            this.codCentroCostoDestinoBuscadorAWIL.ReadOnly = enabled;
            this.codRubroOrigenBuscadorAWIL.ReadOnly = enabled;
            this.codRubroDestinoBuscadorAWIL.ReadOnly = enabled;
            this.valorTextBox.ReadOnly = enabled;
            this.observacionesTextBox.ReadOnly = enabled;
            this.fechaDateTimePicker.Enabled = !enabled;
            this.NuevoButton.Enabled = enabled;
            this.guardarButton.Enabled = !enabled;
            this.cancelarButton.Enabled = !enabled;
        }
        
        #region Eventos asociados a los botones del BindingNavigator

        private void exportar_Click(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            try { Utils.get().exportar(this.spPresupuestoMovimientoSaldosDataGridView); }
            catch (Exception ex) { MessageException.show(ex); }
            Cursor.Current = Cursors.Default;
        }

        private void actualizar_Click(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            ManageForms.reloadForm(this);
            Cursor.Current = Cursors.Default;
        }

        private void filter_Click(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            BindingSource bs = ((BindingNavigator)((ToolStripButton)sender).GetCurrentParent()).BindingSource;
            try
            {
                bs.RemoveFilter();
                this.toolStripTextBox1.Text = string.Empty;
            }
            catch (Exception ex)
            {
                MessageException.show(ex);
                bs.CancelEdit();
            }
            Cursor.Current = Cursors.Default;
        }

        private void filterText_TextChanged(object sender, EventArgs e)
        {

            Cursor.Current = Cursors.WaitCursor;
            BindingSource bs = ((BindingNavigator)((ToolStripTextBox)sender).GetCurrentParent()).BindingSource;
            DataTable table = ((DataSet)bs.DataSource).Tables[bs.DataMember];
            ToolStripTextBox tb = (ToolStripTextBox)sender;
            try
            {
                String filtro = "";
                foreach (DataColumn cl in table.Columns)
                {
                    filtro += "ISNULL(" + cl.ColumnName.ToString() + ",'')+' '+";
                }
                filtro = filtro.Substring(0, filtro.Length - 5);
                filtro += " like'%" + tb.Text + "%'";
                //MessageBox.Show(filtro);
                bs.Filter = filtro;
            }
            catch (Exception ex)
            {
                MessageException.show(ex);
                bs.CancelEdit();
            }
            Cursor.Current = Cursors.Default;
        }


        #endregion
        
        private void NuevoButton_Click(object sender, EventArgs e)
        {
            try
            {
                //-- Cancelo cualquier operacion que se estubiese realizando
                ((DataSet)this.spPresupuestoMovimientoSaldosBindingSource.DataSource).Tables[this.spPresupuestoMovimientoSaldosBindingSource.DataMember].RejectChanges();
                this.spPresupuestoMovimientoSaldosBindingSource.CancelEdit();

                //--- Agrego el nuevo registro
                this.spPresupuestoMovimientoSaldosBindingSource.AddNew();

                //--- Cargo el codigo del presupuesto
                this.codPresupuestoBuscadorAWIL.AWIL_Texto = this.codPresupuesto;
                
                //--- Cargo el codigo del presupuesto
                this.fechaDateTimePicker.Value = DateTime.Now.AddSeconds(2);

                //--- 
                this.bloquearCampos(false);
            }
            catch (Exception ex)
            {
                MessageException.show(ex);
            }
        }

        private void guardarButton_Click(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            try
            {
                Validate();
                this.spPresupuestoMovimientoSaldosBindingSource.EndEdit();

                //---actualizar la lista
                this.tableAdapterManager.UpdateAll(this.controlPresupuestoDataSet);

                //--- 
                this.bloquearCampos(true);

                //-- 
                MessageBox.Show("Operacion realizada con Exito.");
            }
            catch (Exception ex)
            {
                MessageException.show(ex);
            }
            this.Cursor = Cursors.Default;
        }

        private void cancelarButton_Click(object sender, EventArgs e)
        {
            try
            {
                if (MessageBox.Show("¿Desea cancelar la aoperación?", "COTECMAR", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    return;
                }
                this.cancelandoOperacion = true;
                //-- Cancelo cualquier operacion que se estubiese realizando
                ((DataSet)this.spPresupuestoMovimientoSaldosBindingSource.DataSource).Tables[this.spPresupuestoMovimientoSaldosBindingSource.DataMember].RejectChanges();
                this.spPresupuestoMovimientoSaldosBindingSource.CancelEdit();

                this.cancelandoOperacion = false;
                //--- 
                this.bloquearCampos(true);
            }
            catch (Exception ex)
            {
                MessageException.show(ex);
            }
        }

        private void spPresupuestoMovimientoDataGridView_SelectionChanged(object sender, EventArgs e)
        {
            if (this.guardarButton.Enabled && !this.cancelandoOperacion)
            {
                this.bloquearCampos(true);
                //MessageBox.Show("Debe cancelar la edicion para revisar otros movimientos");
                ////--- me quedo en la ultima fila
                //this.spPresupuestoMovimientoDataGridView.CurrentCell = this.spPresupuestoMovimientoDataGridView[0, this.spPresupuestoMovimientoDataGridView.Rows.Count - 1];
            }
        }

        private void codRubroOrigenBuscadorAWIL_Enter(object sender, EventArgs e)
        {
            this.codRubroOrigenActual = this.codRubroOrigenBuscadorAWIL.AWIL_Texto;
        }

        private void codRubroOrigenBuscadorAWIL_Leave(object sender, EventArgs e)
        {
            string filtroTemporal = string.Empty;
            try
            {
                //-- Si se cambio el rubro, blanqueo el filtro CodSaldo origen
                if (this.codRubroOrigenBuscadorAWIL.AWIL_Texto.Trim().Equals(string.Empty) || !this.codRubroOrigenActual.Trim().Equals(this.codRubroOrigenBuscadorAWIL.AWIL_Texto.Trim()))
                {
                    this.codSaldoOrigenComboBox.Text = string.Empty;
                }

                //---- Preparo el filtro de los centros de costo

                //filtroTemporal = this.codCentroCostoOrigenBuscadorAWIL.AWIL_ColumnaRetorno + " IN ('',@@Param,)";
                
                //// TODO: esta línea de código carga datos en la tabla 'controlPresupuestoDataSet.spPresupuestoAnualDetalle' Puede moverla o quitarla según sea necesario.
                //this.spPresupuestoAnualDetalleTableAdapter1.FillBy(
                //    this.controlPresupuestoDataSet.spPresupuestoAnualDetalle,
                //    "CargarDetallePresupuestoRubro",
                //    null,
                //    null,
                //    this.codPresupuestoBuscadorAWIL.AWIL_Texto,
                //    this.codRubroOrigenBuscadorAWIL.AWIL_Texto,
                //    null,
                //    null,
                //    null,
                //    null,
                //    null,
                //    null,
                //    null,
                //    null,
                //    null,
                //    null,
                //    null,
                //    null
                //    );
                
                ////--Obtengo todos los centros de costo y los guardo en una variable que servira de filtro para mostrar solo aquellos centros de costo que esten asociados al rubro seleccionado en el presupuesto indicado.
                //foreach (ControlPresupuestoDataSet.spPresupuestoAnualDetalleRow row in this.controlPresupuestoDataSet.spPresupuestoAnualDetalle.Rows)
                //{
                //    filtroTemporal = filtroTemporal.Replace("@@Param,", "'" + row.CodCentroCosto + "',@@Param,");
                //}
                //filtroTemporal = filtroTemporal.Replace(",@@Param,", "");
                ////--- le asocio el nuevo filtro al bindingSource asociado al buscados de los centros de costo
                //this.codCentroCostoOrigenBuscadorAWIL.AWIL_BindingSource.Filter = filtroTemporal;
            }
            catch (Exception ex)
            {
                MessageException.show(ex);
            }
        }

        private void codRubroDestinoBuscadorAWIL_Enter(object sender, EventArgs e)
        {
            this.codRubroDestinoActual = this.codRubroDestinoBuscadorAWIL.AWIL_Texto;
        }

        private void codRubroDestinoBuscadorAWIL_Leave(object sender, EventArgs e)
        {
            string filtroTemporal = string.Empty;
            //-- Si se cambio el rubro, blanqueo el filtro CodCentroCostoBuscadorAWIL
            if (this.codRubroDestinoBuscadorAWIL.AWIL_Texto.Trim().Equals(string.Empty) || !this.codRubroDestinoActual.Trim().Equals(this.codRubroDestinoBuscadorAWIL.AWIL_Texto.Trim()))
            {
                this.codCentroCostoDestinoBuscadorAWIL.AWIL_Texto = string.Empty;
            }

            //---- Preparo el filtro de los centros de costo

            filtroTemporal = this.codCentroCostoDestinoBuscadorAWIL.AWIL_ColumnaRetorno + " IN ('',@@Param,)";
            // TODO: esta línea de código carga datos en la tabla 'controlPresupuestoDataSet.spPresupuestoAnualDetalle' Puede moverla o quitarla según sea necesario.
            this.spPresupuestoAnualDetalleTableAdapter1.FillBy(
                this.controlPresupuestoDataSet.spPresupuestoAnualDetalle,
                "CargarDetallePresupuestoRubro",
                null,
                null,
                this.codPresupuestoBuscadorAWIL.AWIL_Texto,
                this.codRubroDestinoBuscadorAWIL.AWIL_Texto,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
                );
            //--Obtengo todos los centros de costo y los guardo en una variable que servira de filtro para mostrar solo aquellos centros de costo que esten asociados al rubro seleccionado en el presupuesto indicado.
            foreach (ControlPresupuestoDataSet.spPresupuestoAnualDetalleRow row in this.controlPresupuestoDataSet.spPresupuestoAnualDetalle.Rows)
            {
                filtroTemporal = filtroTemporal.Replace("@@Param,", "'" + row.CodCentroCosto + "',@@Param,");
            }
            filtroTemporal = filtroTemporal.Replace(",@@Param,", "");
            //--- le asocio el nuevo filtro al bindingSource asociado al buscados de los centros de costo
            this.codCentroCostoDestinoBuscadorAWIL.AWIL_BindingSource.Filter = filtroTemporal;
        }

        private void codPresupuestoBuscadorAWIL_Leave(object sender, EventArgs e)
        {
            //--- Limpio los campos
            this.codRubroOrigenBuscadorAWIL.AWIL_Texto = string.Empty;
            this.codRubroDestinoBuscadorAWIL.AWIL_Texto = string.Empty;
            this.codSaldoOrigenComboBox.Text = string.Empty;
            this.codCentroCostoDestinoBuscadorAWIL.AWIL_Texto = string.Empty;
            this.valorTextBox.Text = string.Empty;

            try
            {
                this.spRubroTableAdapter1.FillBy(
                    this.controlPresupuestoDataSet.spRubro,
                    "CargarRubrosPresupuesto",
                    this.codPresupuestoBuscadorAWIL.AWIL_Texto.Trim(),
                    null,
                    null,
                    null,
                    null,
                    null,
                    null
                    );
            }
            catch (Exception ex)
            {
                MessageException.show(ex);
            }
        }

        private void codPresupuestoBuscadorAWIL_AWIL_TextChanged(object sender, EventArgs e)
        {
            //--- Consulto los rubros del presupuesto seleccionado
            if (this.codPresupuestoBuscadorAWIL.ReadOnly)
            {
                try
                {
                    this.spRubroTableAdapter1.FillBy(
                        this.controlPresupuestoDataSet.spRubro,
                        "CargarRubrosPresupuesto",
                        this.codPresupuestoBuscadorAWIL.AWIL_Texto.Trim(),
                        null,
                        null,
                        null,
                        null,
                        null,
                        null
                        );
                    
                    //--- Cargo todos los centros de costo en los buscadores...
                    //this.codCentroCostoOrigenBuscadorAWIL.AWIL_BindingSource.Filter = string.Empty;
                    this.codCentroCostoDestinoBuscadorAWIL.AWIL_BindingSource.Filter = string.Empty;
                }
                catch (Exception)
                {
                }
            }
        }
    }
}